#include <STC15F2K60S2.H>
#include "Key.h"
#include "Seg.h"
#include "LED.h"
#include "Init.h"
#include "iic.h"
#include "ds1302.h"

//第十六届模拟2,要注意记录界面的写法，其中模式与触发次数的结合运用很重要,以及清除历史记录和触发次数>3时，历史纪录的更新如何写,以及如何避免重复触发

#define unchar unsigned char
#define unint  unsigned int
	
unchar Key_down,Key_old,Key_value;
unchar Key_scan_down;
unchar Seg_scan_down;
unchar Seg_show_buf[8]={10,10,10,10,10,10,10,10};
unchar Seg_point_buf[8]={0,0,0,0,0,0,0,0};
unchar LED_enable_buf[8]={0,0,0,0,0,0,0,0};
unchar Seg_index;

unchar Seg_mode;//界面切换  0->时间  1->数据  2->历史  3->触发
unchar mode;//触发的模式  0->1 1->2  2->3
unchar set_time[3]={23,59,50};

float AD_output1;//光敏电阻读取值
float AD_output2;//滑动变阻器读取值
bit warming_flag;//触发标志 0->没触发  1->触发
unchar warming_time[3][3]={10};//数据记录数组
unchar warming_cent;//触发的次数

unchar old_seg_mode;//返回原来的界面
unchar old_mode;//返回记录子界面
unint falg_time3000ms;//触发时间周期

void KEY_ty()
{
	if(Key_scan_down) return ;
	Key_scan_down=1;
	
	Key_value=Key_read();
	Key_down=Key_value & (Key_value^Key_old);
	Key_old=Key_value;
	
	if(Key_down==4)
	{
		if(++Seg_mode==3)  Seg_mode=0;
		if(Seg_mode==2)  mode=0;
	}
	if(Key_down==5)
	{
		if(Seg_mode==2&&++mode==3)
			mode=0;
	}
	if(Key_down==8)
	{
		if(Seg_mode==2)  //觉得这步高
			warming_cent=0;
	}
}

void SEG_ty()
{
	if(Seg_scan_down) return ;
	Seg_scan_down=1;
	
	
	AD_output1=AD_read(0x43)/51.0;//0-5V之间
    AD_output2=AD_read(0x41)/51.0;

	
	Read_time(set_time);
	switch(Seg_mode)
	{
		case 0://时间界面
		Seg_show_buf[0]=set_time[0]/10%10;
		Seg_show_buf[1]=set_time[0]%10;
		Seg_show_buf[2]=11;
		Seg_show_buf[3]=set_time[1]/10%10;
		Seg_show_buf[4]=set_time[1]%10;
		Seg_show_buf[5]=11;
		Seg_show_buf[6]=set_time[2]/10%10;
		Seg_show_buf[7]=set_time[2]%10;
		Seg_point_buf[1]=Seg_point_buf[5]=0;
		break;
		case 1://数据界面
		Seg_show_buf[0]=12;
		Seg_show_buf[1]=(unchar)AD_output1%10;
		Seg_show_buf[2]=(unchar)(AD_output1*10)%10;
		Seg_show_buf[3]=(unint)(AD_output1*100)%10;
		Seg_show_buf[4]=13;
		Seg_show_buf[5]=(unchar)AD_output2%10;
		Seg_show_buf[6]=(unchar)(AD_output2*10)%10;
		Seg_show_buf[7]=(unint)(AD_output2*100)%10;
		Seg_point_buf[1]=Seg_point_buf[5]=1;
		break;
		case 2://记录界面
		Seg_show_buf[0]=14;
		Seg_show_buf[1]=mode+1;  //当mode->做索引用时,根据warming_cent触发次数的大小来判定各记录子界面是否有数据记录
		Seg_show_buf[2]=mode<warming_cent?warming_time[mode][0]/10:11;
		Seg_show_buf[3]=mode<warming_cent?warming_time[mode][0]%10:11;
		Seg_show_buf[4]=mode<warming_cent?warming_time[mode][1]/10:11;
		Seg_show_buf[5]=mode<warming_cent?warming_time[mode][1]%10:11;
		Seg_show_buf[6]=mode<warming_cent?warming_time[mode][2]/10:11;
		Seg_show_buf[7]=mode<warming_cent?warming_time[mode][2]%10:11;
		Seg_point_buf[1]=Seg_point_buf[5]=0;	
		break;
		case 3://触发界面
		Seg_show_buf[0]=15;
		Seg_show_buf[1]=15;
		Seg_show_buf[2]=warming_time[0][0]/10;
		Seg_show_buf[3]=warming_time[0][0]%10;
		Seg_show_buf[4]=warming_time[0][1]/10;
		Seg_show_buf[5]=warming_time[0][1]%10;
		Seg_show_buf[6]=warming_time[0][2]/10;
		Seg_show_buf[7]=warming_time[0][2]%10;
		Seg_point_buf[1]=Seg_point_buf[5]=0;		
		break;
	}
	
}


void LED_ty()
{
	unchar i;
	for(i=0;i<3;i++)
	{
	  LED_enable_buf[i]=(Seg_mode==i);
	}	
	LED_enable_buf[7]=(Seg_mode==3);
	
	if(AD_output1<AD_output2)
	{
		warming_flag=1;
	}
	else
	{
		warming_flag=0;
	}
	if(warming_flag==1&&Seg_mode!=3)//这一点很重要
	{
		warming_flag=0;//防止触发周期内重复触发,(还得加上Seg_mode!=3这条语句)，因3s时间很长，在你调节AD_output1与AD_output2大小电压时的间隙，可能进入多次下面语句导致Seg_mode被刷为3
		old_seg_mode=Seg_mode;
		old_mode=mode;
		Seg_mode=3;//切换到触发界面
		if(warming_cent!=0)//不为初始转态
		{
			for(i=2;i>0;i--)//数据覆盖,先触发的索引值大(这里好像隐含的条件，当触发的次数>3时，纪录的数据是向后移的)
			{
				warming_time[i][0]=warming_time[i-1][0];
				warming_time[i][1]=warming_time[i-1][1];
				warming_time[i][2]=warming_time[i-1][2];
			}
		}
		//无论是首次触发，还不是首次触发，由于最近一次的触发时间的索引值为1，即只能这样写
		warming_time[0][0]=set_time[0];
		warming_time[0][1]=set_time[1];
		warming_time[0][2]=set_time[2];
		
		if(++warming_cent==4) //触发次数++
			warming_cent=3;
	}
}


void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1=1;
	EA=1;
}

void Timer1_serve() interrupt 3
{
	if(++Key_scan_down==10)  Key_scan_down=0;
	if(++Seg_scan_down==200) Seg_scan_down=0;
	if(++Seg_index==8)  Seg_index=0;
	Seg_disp(Seg_index,Seg_show_buf[Seg_index],Seg_point_buf[Seg_index]);
	LED_showdisp(Seg_index,LED_enable_buf[Seg_index]);
	
	if(Seg_mode==3&&++falg_time3000ms==3000)
	{
		Seg_mode=old_seg_mode;
		mode=old_mode;
		falg_time3000ms=0;
	}
	
	//下面注释部分也行
//	if(Seg_mode==3)
//	{
//		if(++falg_time3000ms==3000)
//		{
//			Seg_mode=old_seg_mode;
//			mode=old_mode;
//		}
//	}
//	else
//	{
//		falg_time3000ms=0;
//	}
}

void main()
{
	Init_system();
	Timer1Init();
	AD_read(0x43);
	AD_read(0x41);
	Set_time(set_time);
	while(1)
	{
		KEY_ty();
		SEG_ty();
		LED_ty();
	}
}